package com.gameley.dmgtpf.common.utils;

import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

/**
 * token生成和校验 *
 *
 * @version 1.0<br>
 * @qualiFild TokenUtilsmm.java<br>
 * @author：LiBencheng<br>
 * @date Created on 2021年7月30日<br>
 */
public class TokenUtil
{
    private static Map<String, String> MAP_TOKENS = new ConcurrentHashMap<String, String>();
    private static Map<String, String> MAP_USERS = new ConcurrentHashMap<String, String>();
    private static final int VALID_TIME = 60 * 60 * 2;// token有效期(秒)
    public static final String TOKEN_ERROR = "E";// 非法
    public static final String TOKEN_OVERDUE = "O";// 过期
    public static final String TOKEN_FAILURE = "F";// 失效
    public static final String TOKEN_SUCCESS = "S";// 没问题
    
    /**
     * *********************************************************** <br>
     * *说明：生成token,该token长度不一致,如需一致,可自行MD5或者其它方式加密一下 该方式的token只存在磁盘上,如果项目是分布式,最好用redis存储 <br>
     *
     * @param str 该字符串可自定义,在校验token时要保持一致
     * @return <br>
     * @String <br>
     * @methods com.gameley.dmgtpf.common.utils.TokenUtilsmm#getToken <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月26日 <br>
     * @time 下午7:50:35 <br>
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see <br>
     */
    public static String getToken(String str)
    {
        if (null != MAP_TOKENS.get(str))
        {
            MAP_USERS.remove(MAP_TOKENS.get(str));
        }
        String token = TokenEncryptUtils.encoded(getCurrentTime() + "," + str);
        MAP_TOKENS.put(str, token);
        MAP_USERS.put(token, str);
        
        return token;
    }
    
    /**
     * *********************************************************** <br>
     * *说明：校验token的有效性 <br>
     *
     * @param token
     * @return <br>
     * @String <br>
     * @methods com.gameley.dmgtpf.common.utils.TokenUtilsmm#checkToken <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月26日 <br>
     * @time 下午7:50:00 <br>
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see <br>
     */
    public static String checkToken(String token)
    {
        if (token == null)
        {
            return TOKEN_ERROR;
        }
        if (PubEnvUtil.isEmpty(MAP_USERS.get(token)))
        {
            return TOKEN_ERROR;
        }
        
        String[] tArr = TokenEncryptUtils.decoded(token).split(",");
        if (tArr.length != 2)
        {
            return TOKEN_ERROR;
        }
        // token生成时间戳
        int tokenTime = Integer.parseInt(tArr[0]);
        // 当前时间戳
        int currentTime = getCurrentTime();
        if (currentTime - tokenTime < VALID_TIME)
        {
            String tokenStr = tArr[1];
            String mToken = MAP_TOKENS.get(tokenStr);
            if (mToken == null)
            {
                return TOKEN_OVERDUE;
            }
            else if (!mToken.equals(token))
            {
                return TOKEN_OVERDUE;
            }
            return tokenStr;
        }
        else
        {
            return TOKEN_FAILURE;
        }
        
    }
    
    /**
     * *********************************************************** <br>
     * *说明： 获取当前时间戳（10位整数）<br>
     *
     * @return <br>
     * @int <br>
     * @methods com.gameley.dmgtpf.common.utils.TokenUtilsmm#getCurrentTime <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月26日 <br>
     * @time 下午7:50:09 <br>
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see <br>
     */
    public static int getCurrentTime()
    {
        return (int) (System.currentTimeMillis() / 1000);
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <br>
     *
     * @param token <br>
     * @void <br>
     * @methods com.gameley.dmgtpf.common.utils.TokenUtilsmm#removeToken <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午3:04:30 <br>
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see <br>
     */
    public static void removeToken(String token)
    {
        String map_tokens_key = MAP_USERS.get(token);
        if (null != map_tokens_key)
        {
            MAP_TOKENS.remove(map_tokens_key);
        }
        MAP_USERS.remove(token);
    }
    
    /**
     * *********************************************************** <br>
     * *说明： 移除过期的token<br>
     *
     * @void <br>
     * @methods com.gameley.dmgtpf.common.utils.TokenUtilsmm#removeInvalidToken <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月26日 <br>
     * @time 下午7:44:13 <br>
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see <br>
     *      <br>
     */
    public static void removeInvalidToken()
    {
        int currentTime = getCurrentTime();
        for (Entry<String, String> entry : MAP_TOKENS.entrySet())
        {
            String[] tArr = TokenEncryptUtils.decoded(entry.getValue()).split(",");
            int tokenTime = Integer.parseInt(tArr[0]);
            if (currentTime - tokenTime > VALID_TIME)
            {
                String map_users_key = MAP_TOKENS.get(entry.getKey());
                MAP_USERS.remove(map_users_key);
                MAP_TOKENS.remove(entry.getKey());
            }
        }
    }
}
